package cn.edu.dgut.sai.file;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.IOException;

/**
 * @author Sai
 * Created by Sai on 2019-03-03.
 *
 * @see MultipartConfig
 * 使用注解@MultipartConfig 将一个 Servlet 标识为支持文件上传。
 * Servlet3 将 multipart/form-data 的 POST 请求封装成 Part，通过 Part 对文件进行上传。
 * Servlet3 没有提供直接获取文件名的方法,需要从请求头中解析出来。
 *
 * @see Part
 * {@link HttpServletRequest} 提供了两个方法用于从请求中解析出上传的文件：
 * {@link HttpServletRequest#getPart(String)}
 * {@link HttpServletRequest#getParts()}
 * 前者用于获取请求中给定 name 的文件，后者用于获取所有的文件。
 * 每一个文件用一个 javax.servlet.http.Part 对象来表示。
 * 该接口提供了处理文件的简易方法，比如 write()、delete() 等。
 * 至此，结合 HttpServletRequest 和 Part 来保存上传的文件变得非常简单。
 *
 * 本Servlet演示上传单个文件时的处理过程。
 *
 * 详情请查看javaee-web-api-8.0-javadoc的api文档
 * 下载地址：https://jcp.org/aboutJava/communityprocess/final/jsr366/index.html
 *
 * curl测试上传文件：
 * curl http://localhost:8080/webapp-demo/upload -F "file=@/Users/sai/Desktop/a.jpg" -v -i
 */
@WebServlet("/upload")
@MultipartConfig(location = "/Users/sai/Downloads")// location改为本地的绝对路径,如： d:\\download
public class UploadServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        // 获取请求项，封装成Part对象
        // request.getPart方法的传参为前端页面from表单的input文件组件的name值
        Part part = request.getPart("file");

        // part.getSubmittedFileName()方法获取上传文件的文件名
        String fileName = part.getSubmittedFileName();
        System.out.println("上传文件的文件名: " + fileName);

        // 根据@MultipartConfig的location配置的目录上传文件，直接传参文件名即可。
        part.write(fileName);

        response.getWriter().write("文件上传成功！");

    }
}
